package com.aps.server.service;

import com.aps.common.boot.CoreApplicationContext;
import com.aps.common.service.TestGenericService;
import com.aps.server.entity.BasicEquipMaintenance;
import com.aps.server.mapper.BasicEquipMaintenanceMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 设备维护记录服务类
 * 提供设备维护记录相关的业务逻辑处理
 */
@Slf4j
@Service
public class BasicEquipMaintenanceService extends TestGenericService {
    @Resource
    BasicEquipMaintenanceMapper basicEquipMaintenanceMapper;

    
    /**
     * 创建设备维护记录
     * 
     * @param basicEquipMaintenance 设备维护记录信息
     * @return 是否创建成功
     */
    public boolean createEquipMaintenance(BasicEquipMaintenance basicEquipMaintenance) {
        // 自动设置租户ID
        if (basicEquipMaintenance.getTenantId() == null || basicEquipMaintenance.getTenantId().trim().isEmpty()) {
            basicEquipMaintenance.setTenantId(getCurrentTenantId());
        }
        
        basicEquipMaintenance.setCreateTime(LocalDateTime.now());
        basicEquipMaintenance.setUpdateTime(LocalDateTime.now());
        
        int result = basicEquipMaintenanceMapper.insert(basicEquipMaintenance);
        log.info("创建设备维护记录结果: {}, 维护记录ID: {}, 租户ID: {}", result > 0 ? "成功" : "失败", basicEquipMaintenance.getId(), basicEquipMaintenance.getTenantId());
        return result > 0;
    }
    
    /**
     * 根据ID查询设备维护记录
     * 
     * @param id 维护记录ID
     * @return 设备维护记录信息
     */
    public BasicEquipMaintenance getEquipMaintenanceById(String id) {
        String tenantId = getCurrentTenantId();
        QueryWrapper<BasicEquipMaintenance> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", id).eq("tenant_id", tenantId);
        
        BasicEquipMaintenance maintenance = basicEquipMaintenanceMapper.selectOne(queryWrapper);
        log.info("查询设备维护记录ID: {}, 租户ID: {}, 结果: {}", id, tenantId, maintenance != null ? "找到" : "未找到");
        return maintenance;
    }
    
    /**
     * 根据ID和指定租户ID查询设备维护记录
     * 
     * @param id 维护记录ID
     * @param tenantId 租户ID
     * @return 设备维护记录信息
     */
    public BasicEquipMaintenance getEquipMaintenanceById(String id, String tenantId) {
        QueryWrapper<BasicEquipMaintenance> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", id).eq("tenant_id", tenantId);
        
        BasicEquipMaintenance maintenance = basicEquipMaintenanceMapper.selectOne(queryWrapper);
        log.info("查询设备维护记录ID: {}, 租户ID: {}, 结果: {}", id, tenantId, maintenance != null ? "找到" : "未找到");
        return maintenance;
    }
    
    /**
     * 更新设备维护记录信息
     * 
     * @param basicEquipMaintenance 设备维护记录信息
     * @return 是否更新成功
     */
    public boolean updateEquipMaintenance(BasicEquipMaintenance basicEquipMaintenance) {
        basicEquipMaintenance.setUpdateTime(LocalDateTime.now());
        
        QueryWrapper<BasicEquipMaintenance> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", basicEquipMaintenance.getId()).eq("tenant_id", basicEquipMaintenance.getTenantId());
        
        int result = basicEquipMaintenanceMapper.update(basicEquipMaintenance, queryWrapper);
        log.info("更新设备维护记录结果: {}, 维护记录ID: {}, 租户ID: {}", result > 0 ? "成功" : "失败", basicEquipMaintenance.getId(), basicEquipMaintenance.getTenantId());
        return result > 0;
    }
    
    /**
     * 删除设备维护记录
     * 
     * @param id 维护记录ID
     * @return 是否删除成功
     */
    public boolean deleteEquipMaintenance(String id) {
        String tenantId = getCurrentTenantId();
        return deleteEquipMaintenance(id, tenantId);
    }
    
    /**
     * 根据ID和租户ID删除设备维护记录
     * 
     * @param id 维护记录ID
     * @param tenantId 租户ID
     * @return 是否删除成功
     */
    public boolean deleteEquipMaintenance(String id, String tenantId) {
        QueryWrapper<BasicEquipMaintenance> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("id", id).eq("tenant_id", tenantId);
        
        int result = basicEquipMaintenanceMapper.delete(queryWrapper);
        log.info("删除设备维护记录结果: {}, 维护记录ID: {}, 租户ID: {}", result > 0 ? "成功" : "失败", id, tenantId);
        return result > 0;
    }
    
    /**
     * 查询当前租户的设备维护记录列表
     * 
     * @return 设备维护记录列表
     */
    public List<BasicEquipMaintenance> getEquipMaintenancesByTenantId() {
        String tenantId = getCurrentTenantId();
        return getEquipMaintenancesByTenantId(tenantId);
    }
    
    /**
     * 根据租户ID查询设备维护记录列表
     * 
     * @param tenantId 租户ID
     * @return 设备维护记录列表
     */
    public List<BasicEquipMaintenance> getEquipMaintenancesByTenantId(String tenantId) {
        List<BasicEquipMaintenance> maintenances = basicEquipMaintenanceMapper.selectByTenantId(tenantId);
        log.info("根据租户ID查询设备维护记录列表, 租户ID: {}, 数量: {}", tenantId, maintenances.size());
        return maintenances;
    }
    
    /**
     * 分页查询当前租户的设备维护记录列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @return 分页设备维护记录列表
     */
    public IPage<BasicEquipMaintenance> getEquipMaintenancesByTenantIdPage(int current, int size) {
        String tenantId = getCurrentTenantId();
        return getEquipMaintenancesByTenantIdPage(current, size, tenantId);
    }
    
    /**
     * 根据租户ID分页查询设备维护记录列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param tenantId 租户ID
     * @return 分页设备维护记录列表
     */
    public IPage<BasicEquipMaintenance> getEquipMaintenancesByTenantIdPage(int current, int size, String tenantId) {
        Page<BasicEquipMaintenance> page = new Page<>(current, size);
        IPage<BasicEquipMaintenance> result = basicEquipMaintenanceMapper.selectPageByTenantId(page, tenantId);
        log.info("分页查询设备维护记录列表, 租户ID: {}, 当前页: {}, 每页大小: {}, 总数: {}", tenantId, current, size, result.getTotal());
        return result;
    }
    
    /**
     * 根据设备编码查询设备维护记录列表
     * 
     * @param equipId 设备编码
     * @param tenantId 租户ID
     * @return 设备维护记录列表
     */
    public List<BasicEquipMaintenance> getEquipMaintenancesByEquipId(String equipId, String tenantId) {
        List<BasicEquipMaintenance> maintenances = basicEquipMaintenanceMapper.selectByEquipId(equipId, tenantId);
        log.info("根据设备编码查询设备维护记录列表, 设备编码: {}, 租户ID: {}, 数量: {}", equipId, tenantId, maintenances.size());
        return maintenances;
    }
    
    /**
     * 根据设备编码分页查询设备维护记录列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param equipId 设备编码
     * @param tenantId 租户ID
     * @return 分页设备维护记录列表
     */
    public IPage<BasicEquipMaintenance> getEquipMaintenancesByEquipIdPage(int current, int size, String equipId, String tenantId) {
        Page<BasicEquipMaintenance> page = new Page<>(current, size);
        IPage<BasicEquipMaintenance> result = basicEquipMaintenanceMapper.selectPageByEquipId(page, equipId, tenantId);
        log.info("分页查询设备维护记录列表, 设备编码: {}, 租户ID: {}, 当前页: {}, 每页大小: {}, 总数: {}", equipId, tenantId, current, size, result.getTotal());
        return result;
    }
    
    /**
     * 查询正在维护的设备记录
     * 
     * @param tenantId 租户ID
     * @return 正在维护的设备记录列表
     */
    public List<BasicEquipMaintenance> getActiveMaintenances(String tenantId) {
        List<BasicEquipMaintenance> maintenances = basicEquipMaintenanceMapper.selectActiveMaintenance(tenantId);
        log.info("查询正在维护的设备记录, 租户ID: {}, 数量: {}", tenantId, maintenances.size());
        return maintenances;
    }
    
    /**
     * 根据维护时间范围查询设备维护记录列表
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户ID
     * @return 设备维护记录列表
     */
    public List<BasicEquipMaintenance> getEquipMaintenancesByTimeRange(LocalDateTime startTime, LocalDateTime endTime, String tenantId) {
        List<BasicEquipMaintenance> maintenances = basicEquipMaintenanceMapper.selectByMaintenanceTimeRange(startTime, endTime, tenantId);
        log.info("根据维护时间范围查询设备维护记录列表, 开始时间: {}, 结束时间: {}, 租户ID: {}, 数量: {}", startTime, endTime, tenantId, maintenances.size());
        return maintenances;
    }
    
    /**
     * 统计租户下的设备维护记录数量
     * 
     * @param tenantId 租户ID
     * @return 设备维护记录数量
     */
    public Long countEquipMaintenancesByTenantId(String tenantId) {
        Long count = basicEquipMaintenanceMapper.countByTenantId(tenantId);
        log.info("统计租户设备维护记录数量, 租户ID: {}, 数量: {}", tenantId, count);
        return count;
    }
    
    /**
     * 统计设备编码下的维护记录数量
     * 
     * @param equipId 设备编码
     * @param tenantId 租户ID
     * @return 设备维护记录数量
     */
    public Long countEquipMaintenancesByEquipId(String equipId, String tenantId) {
        Long count = basicEquipMaintenanceMapper.countByEquipId(equipId, tenantId);
        log.info("统计设备维护记录数量, 设备编码: {}, 租户ID: {}, 数量: {}", equipId, tenantId, count);
        return count;
    }
    
    /**
     * 批量创建设备维护记录
     * 
     * @param maintenances 设备维护记录列表
     * @return 成功创建的数量
     */
    public int batchCreateEquipMaintenances(List<BasicEquipMaintenance> maintenances) {
        if (maintenances == null || maintenances.isEmpty()) {
            return 0;
        }
        
        String tenantId = getCurrentTenantId();
        LocalDateTime now = LocalDateTime.now();
        
        int successCount = 0;
        for (BasicEquipMaintenance maintenance : maintenances) {
            try {
                if (maintenance.getTenantId() == null || maintenance.getTenantId().trim().isEmpty()) {
                    maintenance.setTenantId(tenantId);
                }
                maintenance.setCreateTime(now);
                maintenance.setUpdateTime(now);
                
                int result = basicEquipMaintenanceMapper.insert(maintenance);
                if (result > 0) {
                    successCount++;
                }
            } catch (Exception e) {
                log.error("批量创建设备维护记录失败, 设备编码: {}", maintenance.getEquipId(), e);
            }
        }
        
        log.info("批量创建设备维护记录完成, 总数: {}, 成功: {}", maintenances.size(), successCount);
        return successCount;
    }
}
